// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraExperienceManager.h"
#include "GameModes/LyraExperienceManager.h"
#include "Engine/Engine.h"
#include "Subsystems/SubsystemCollection.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraExperienceManager)

#if WITH_EDITOR

/**
 * PIE开始时调用，清空插件请求计数映射
 */
void ULyraExperienceManager::OnPlayInEditorBegun()
{
	ensure(GameFeaturePluginRequestCountMap.IsEmpty()); // 确保映射为空
	GameFeaturePluginRequestCountMap.Empty(); // 清空映射
}

/**
 * 通知插件激活，增加对应插件的请求计数
 * @param PluginURL 插件URL
 */
void ULyraExperienceManager::NotifyOfPluginActivation(const FString PluginURL)
{
	if (GIsEditor) // 仅在编辑器模式下处理
	{
		ULyraExperienceManager* ExperienceManagerSubsystem = GEngine->GetEngineSubsystem<ULyraExperienceManager>(); // 获取引擎子系统
		check(ExperienceManagerSubsystem); // 确保子系统有效

		// 跟踪激活此插件的请求者数量。允许多个加载/激活请求，因为并发请求会被处理。
		int32& Count = ExperienceManagerSubsystem->GameFeaturePluginRequestCountMap.FindOrAdd(PluginURL); // 查找或添加计数
		++Count; // 增加计数
	}
}

/**
 * 请求停用插件，仅当最后一个请求者时才真正停用
 * @param PluginURL 插件URL
 * @return 是否允许停用
 */
bool ULyraExperienceManager::RequestToDeactivatePlugin(const FString PluginURL)
{
	if (GIsEditor) // 仅在编辑器模式下处理
	{
		ULyraExperienceManager* ExperienceManagerSubsystem = GEngine->GetEngineSubsystem<ULyraExperienceManager>(); // 获取引擎子系统
		check(ExperienceManagerSubsystem); // 确保子系统有效

		// 只允许最后一个请求者停用插件
		int32& Count = ExperienceManagerSubsystem->GameFeaturePluginRequestCountMap.FindChecked(PluginURL); // 查找计数（必须存在）
		--Count; // 减少计数

		if (Count == 0) // 如果计数归零
		{
			ExperienceManagerSubsystem->GameFeaturePluginRequestCountMap.Remove(PluginURL); // 从映射中移除
			return true; // 允许停用
		}

		return false; // 不允许停用
	}

	return true; // 非编辑器模式下总是允许停用
}

#endif